/* 
  * push: 向数组末尾增加内容
  *  @params
  *   多个任意类型
  *  @return
  *  ​ 新增后数组的长度
*/

/* let ary = [10, 20];
let res = ary.push(30, 'AA', {
  name: 'zhangsan'
});
ary[ary.length] = 40;
console.log(res, ary); */

/* 
  * unshift: 向数组开始的位置增加内容
  *  @params
  *   多个任意类型
  *  @return
  *  ​ 新增后数组的长度
*/

/* let ary = [10, 20];
let res = ary.unshift(30, 'AA');
console.log(res, ary); // 4 [30, "AA", 10, 20]

// 基于原生ES6展开运算符, 把原有的ary克隆一份, 在新的数组中创建第一项, 其余的内容使用原始ary中的信息即可, 也算实现了向开始追加的效果
ary = [100, ...ary];
console.log(ary); //  [100, 30, "AA", 10, 20] */

/* 
  * shift: 删除数组中的第一项
  *  @params
  *  @return
  *  ​ 删除的那一项
*/
/* let ary = [10, 20, 30, 40];
let res = ary.shift();
console.log(res, ary); // 10 [20, 30, 40]
// 基于原生JS中的delete, 把数组当做普通的对象, 确实可以删除掉某一项内容, 但是不会影响数组本身的结构特点(length长度不会跟着修改), 真实项目中杜绝这样的删除使用
delete ary[0];
console.log(ary); // [1: 30, 2: 40, length: 3]  */

/* 
  * pop: 删除数组中的最后一项
  *  @params
  *  @return
  *  ​ 删除的那一项
*/
/* let ary = [10, 20, 30, 40];
let res = ary.pop();
console.log(res, ary); // 40 [10, 20, 30]

// 基于原生JS让数组数组长度干掉以为, 默认干掉的就是最后一项
ary.length--;
console.log(ary); */

/* 
  * splice: 实现数组的增加、删除、修改
  *  @params
  *   n, m 数字 从索引n开始删除m个元素(m不写, 是删除到末尾)
  *  @return
  *  ​ 把删除的部分用新数组存储起来返回
*/
/* let ary = [10, 20, 30, 40, 50, 60, 70, 80, 90];
let res = ary.splice(2, 4);
console.log(res, ary); // [30, 40, 50, 60]  [10, 20, 70, 80, 90]

// 基于这种方法可以清空一个数组, 把原有数组中的内容以新数组存起来(有点类似数组的克隆: 把原来的数组克隆一份一模一样的给新数组)
// ary.splice(0);
// console.log(res, ary); //  [30, 40, 50, 60] []
和第一项
// 删除最后一项和第一项
ary.splice(ary.length - 1);
ary.splice(0, 1);
console.log(ary); */

/* 
  * splice: 实现数组的增加、删除、修改
  *  @params
  *   n, m, x 从索引n开始删除m个元素, 用x占用删除的部分
  *   n, 0, x 从索引n开始, 一个都不删除, 把x放到索引n的前面
  *  @return
  *  ​ 把删除的部分用新数组存储起来返回
*/

/* let ary = [10, 20, 30, 40];
let res = ary.splice(1, 2, '珠峰培训', 'zhangsan');
console.log(res, ary); // [20, 30] [10, "珠峰培训", "zhangsan", 40]

// 增加
ary.splice(3, 0, '李四');
console.log(ary);

// 向数组末尾追加
ary.splice(ary.length, 0, '王五');
console.log(ary);

// 向数组开始追加
ary.splice(0, 0, '张三');
console.log(ary); */

// ===================================================
/* 
  * slice: 实现数组的查询
  *  @params
  *   n,m 都是数字 从索引n开始, 找到索引为m的地方(不包含m这一项)
  *  @return
  *  ​ 把找到的内容以新数组的形式放回, 原来的数组不变
*/
/* let ary = [10, 20, 30, 40, 50];
let res = ary.slice(1, 3);
console.log(res, ary); // [20, 30]  [10, 20, 30, 40, 50]

// M不写是找到末尾
res = ary.slice(1);
console.log(res);

// 数组的克隆, 参数0也可以不写
res = ary.slice(0);
console.log(res); */

/* 
  * concat: 实现数组拼接
  *  @params
  *   多个任意类型值
  *  @return
  *  ​ 拼接后的新数组(原来数组不变)
*/

/* let ary1 = [10, 20, 30];
let ary2 = [40, 50, 60];
let res = ary1.concat();
console.log(res);
res = ary1.concat('张三', ary2);
console.log(res); */

/* 
  * toString: 把数组转换为字符串
  *  @params
  *  @return
  *  ​ 转换后的字符串, 每一项用逗号分隔(原来数组不变)
*/

/* let ary = [10, 20, 30];
let res = ary.toString();
console.log(res);
console.log([].toString()); // ""
console.log([].toString()); // "12" */

/* 
  * join: 把数组转换为字符串
  *  @params
  *    指定的分隔符(字符串格式)
  *  @return
  *  ​ 转换后的字符串(原来数组不变)
*/

/* let ary = [10, 20, 30];
let res = ary.join('');
console.log(res); // '102030'

res = ary.join('|');
console.log(res); // '10|20|30'

res = ary.join("+");
console.log(res); // '10+20+30'
console.log(eval(res)) // 60 eval把字符串变为JS表达式执行 */

/* 
  * indexOf / lastIndexOf: 检测当前项在数组中第一次或者最后一次出现位置的索引(在IE6~8中不兼容)
  *  @params
  *    要检索的这一项内容
  *  @return
  *  ​ 这一项出现的位置索引值(数字), 如果数组中没有这一项, 返回的结果是-1, 原数组不变
*/
/* let ary = [10, 20, 30, 10, 20, 30];
console.log(ary.indexOf(20)); // 1
console.log(ary.lastIndexOf(20)); // 4

// 验证ary中是否包含'张三'
if(ary.indexOf('张三') === -1) {
  // 不包含
}
// 也可以直接使用ES6新提供的includes方法判断
if(ary.includes('张三')) {
  // 包含: 如果存在返回的是true
} */

/* 
  * reverse: 把数组倒过来排列
  *  @params
  *  @return
  *  ​ 排列后的新数组 原来数组改变
*/
/* let ary = [12, 10, 5, 38, 15, 22];
ary.reverse();
console.log(ary); // [22, 15, 38, 5, 10, 12] */

/* 
  * sort: 实现数组的排序
  *  @params
  *   可以没有, 也可以是个函数
  *  @return
  *  ​ 排序后的新数组 原来数组改变
*/
/* let ary = [7, 8, 2, 5, 6, 1];
ary.sort();
console.log(ary);

// sort方法中如果不传递参数, 是无法处理10以上数字排序的(它默认按照每一项第一个字符来拍, 不是我们想要的结果)
/* ary = [12, 10, 5, 38, 15, 22];
ary.sort();
console.log(ary); // [10, 12, 15, 22, 38, 5]

// 想要实现多位数正常排序, 需要给sort传递一个函数, 函数中返回 a - b 实现升序, 返回 b - a 实现降序
ary = [12, 10, 5, 38, 15, 22];
 // a 和 b 是相邻的两项
ary.sort((a, b) => a - b);
console.log(ary); */


// ========================================
/* 
  * forEach: 遍历数组中的每一项内容
  * @params
  *   回调函数
  * @return
  *   原数组不变
*/

let ary = [12, 15, 9, 28, 10, 22];
// 基于原生JS中的循环可以实现
/* for(let i = 0; i < ary.length; i++) {
  console.log(i, ary[i]);
} */

ary.forEach((item, index) => {
  // 数组中有多少项, 函数就会被默认执行多少次
  // 每一次执行函数: item是数组中的当前要操作的这一项, index是当前项的索引
  console.log('索引: ' + index + ' 内容: ' + item);
});